条件評価のための"((△condition△))"
表現方法が[...]を使用するよりも解釈しやすくなる場合は、このような方法取られている。
条件評価のための"[△condition△]"
終了ステータスは、制御構造が評価する唯一の対象であるが、コマンドが正しく実行されたかどうかのみを評価しているわけでは有りません。シェルには、さまざまな評価ができるように、ブラケット"[△condition△]"で囲む制御構造が用意されているのです。
"[△condition△]"を使用することで、単純な比較でなく、数値のさまざまな論理式の比較できるのです。この"[△condition△]"は、ステートメントですが、中に書かれているconditionの終了ステータスが真(true)か偽(false)かただそれだけを返すというものであるため、このブラケットは、制御構造文に適したものであるといえます。ただ表現方法などで数値運算の場合は、色々な意味合いから、別の書式を使う場合が多いようです。
注) 括弧()をエスケープ\(バックスラッシュ)しなくてはならないため、余計な文字が増える。
注) $((..))が返す値が、真(true)の場合、1 偽(false)の場合、0で[..]の物と反対になっているのでややこしいのだと思う。
注)このconditionの前後のブラケットは、conditonをはさむ側に必ずSPACEが必要になりますので注意してください。
例) ["$a" = "$b"] 間違い -> [△"$a" = "$b"△] 修正後 SPACEの表現がしずらいので、三角で書いてます。
test
二つの値を比較するテストを行いたいことが良くありますが、このようなことをする場合、testを使います。このtestは、比較が終わり成功すると真(true)0が帰ります。 このコマンドは、整数も扱うことができます。
書き方
test str1 -option str2
test fileA -option strB
test -option str1
test -option fileAエスケープ \(.......\)
括弧でグループ化ができる。
書き方
[ \( "2" > "1" \) && \( "1"= "3" \) ]
ここから本番
数値の比較 あくまでも数値比較です。文字では有りません。
理論演算子 真(true)0の条件 1 && test1 と test2 真偽の論理積
真(true)0 and 真(true)0 偽(false)1 and 偽(false)12 || test1 と test2の真偽の論理和
真(true)0 or 真(true)0 偽(false)1 or 偽(false)1 真(true)0 or 偽(false)1比較演算後の真(true)0偽(false)1に付いて論理演算をします。
| 演算子 | 真(true)の場合の条件 | |
| 1 | a -eq b | aがbとが等しい。 |
| 2 | a -ne b | aがbとが等しくない。 |
| 3 | a -lt b | aがbより小さい。 |
| 4 | a -gt b | aがbより大きい。 |
| 5 | a -le b | aがb以下です。 |
| 6 | a -ge b | aがb以上です。 |
数値演算子を使った例
if [ 1 -eq 1 ]; then # @-eq
echo 同じ数値です。
fi
if [ 1 -ne 2 ]; then # A-ne
echo 違う数値です。
fi
if [ 1 -lt 2 ]; then # B-lt
echo 小さいです。
fi
if [ 2 -gt 1 ]; then # C-gt
echo 大きいです。
fi
if [ \( 1 -le 2 \) && \( 2 -le 2 \) ]; then # D-le
echo 小さいか等しいです。
fi
if [ \( 2 -ge 1 \) && \( 2 -ge 2 \) ]; then # E-ge
echo 大きいか等しいです。
fi
比較例
if [ \( 2 -gt 1 \) && \( 2 -le 1 \) ]; then
echo 合っています。
else
echo 間違っています。
別法:中でも書きましたが、真偽が反転するので。
if [ $(((2 > 1) && (4 <= 1))) = 1 ]; then # $(((2 > 1) && (4 <= 1)))の評価結果が偽(false)なので0を返しているのに対して、式が真(true)1であるかと比較させて結果的に違うので偽(false)1になる。
echo 合っています。
else
echo 間違っています。
fi簡単に書くと、
if (( (2 > 1) && ( 2 <= 1) )); then # (( (2 > 1) && ( 2 <= 1) ))の演算結果は、終了ステータス1偽(false)を返す。
echo 合っています。
else
echo 間違っています。
色々な画像ファイル名から画像を判断しgif-fileへ変換し、filen-nameもgifへ変えるプログラムを使って引数処理の使い方を理解しよう。
filename=$1
if [ -z $filename ]; then # E-zでfilenameがNULLであるか判断している。
echo "profile: ファイルがありません."
exit # 判定終了
fi
for filename in "$@"; do
ppmfile=${filename.*}.ppm
case $filename in
*.gif ) exit 0 ;;
*.tga ) tgatopmm $filename > $ppmfile ;;
*.xpm ) xpmtoppm $filename > $ ppmfile ;;
*.pcx ) pcxtoppm $filename > $ ppmfile ;;
*.tif ) tifftopmm $filename > $ppmfile ;;
*.jpg ) djpeg $filename > $ppmfile ;;
* ) echoo "profile: $filename 処理対象にない画像ファイルです。"
exit 1 ;; # 判定終了
esac
outfile=${ppmfile%.ppm}.gif
ppmquant -quiet 256 $ppmfile | ppmogif -quiet > $outfile # ppmに加工されたfileを変換あわせて、サフィクスgifへ変えた名前で書き出す。
rm $ppnfile # tmpとして作成された.ppmを消す。
done
## stop run ##